package com.code.soulnetty.modbus.client.service;

import lombok.Getter;

/**
 * 数据类型
 * int16
 * int32
 *
 **/
@Getter
public enum DataType {
    /**
     * 主要用于遥信数据,适用于功能码为1和2
     */
    BOOLEAN(1, 1),
    /**
     * 主要用于遥测数据，适用于功能码为3和4，且为DI量的情况
     */
    BIT_INT(1, 1),
    /**
     * 有符号短整形
     */
    SHORT(1, 16),
    /**
     * 无符号短整形
     */
    SHORT_UNSIGNED(1, 16),
    /**
     * BCD
     */
    BCD(1, 16),
    /**
     * 有符号整形
     */
    INT(2, 32),
    /**
     * 无符号整形
     */
    INT_UNSIGNED(2, 32),
    /**
     * BCD
     */
    BCD_FOUR(2, 32),
    /**
     * 有符号长整形
     */
    LONG(4, 64),
    /**
     * 无符号长整形
     */
    LONG_UNSIGNED(4, 64),
    /**
     * 单精度浮点数
     */
    FLOAT(2, 32),
    /**
     * 双精度浮点数
     */
    DOUBLE(4, 64),
    /**
     * 时间
     */
    TIME(4, 64),
    /**
     * 时间和数据
     */
    DTIME(6, 96),
    /**
     * 两个寄存器存储组合存储数据，按无符号整型解析
     */
    TWO_REG_COM(2, 32),

    /**
     * 三个寄存器存储组合存储数据, 按无符号整型解析, 前两个寄存器表示整数, 后一个寄存器表示小数
     */
    THREE_REG_COM(3, 48),
    ;

    int registerCount;
    int bitCount;

    DataType(int registerCount, int bitCount) {
        this.registerCount = registerCount;
        this.bitCount = bitCount;
    }

    //for test
    public static DataType cast(int index) {
        for (DataType dataType : DataType.values()) {
            if (dataType.ordinal() == index) {
                return dataType;
            }
        }
        return INT;
    }
}
